package com.songqi.common.redis.lock;

/**
 * @description:
 * @author: songqi(13776346982)
 * @date: 2023/8/21 14:00
 */
public interface DistributedLock {

    /**
     * 默认过期时间 5秒
     */
    long TIMEOUT_MILLIS = 5000;

    /**
     * 重试次数
     */
    int RETRY_TIMES = 100;

    /**
     * 每次重试后等待的时间
     */
    long SLEEP_MILLIS = 100;


    /**
     * 获取锁
     * @param key 需要锁定的资源编号
     * @return true/false
     */
    boolean lock(String key);

    /**
     * 获取锁
     * @param key 需要锁定的资源编号
     * @param retryTimes 重试次数
     * @return true/false
     */
    boolean lock(String key, int retryTimes);


    /**
     * 获取锁
     * @param key 需要锁定的资源编号
     * @param retryTimes 重试次数
     * @param sleepMillis 每次重试之间的间隔
     * @return true/false
     */
    boolean lock(String key, int retryTimes, long sleepMillis);


    /**
     * 获取锁
     * @param key 需要锁定的资源编号
     * @param expire 获取锁后的过期时间
     * @return true/false
     */
    boolean lock(String key, long expire);


    /**
     * 获取锁
     * @param key 需要锁定的资源编号
     * @param expire 获取锁后的过期时间
     * @param retryTimes 获取锁失败后的重试次数
     * @return true/false
     */
    boolean lock(String key, long expire, int retryTimes);

    /**
     * 获取锁
     * @param key 需要锁定的资源编号
     * @param expire 获取锁后的过期时间
     * @param retryTimes 获取锁失败后的重试次数
     * @param sleepMillis 每次重试之间的间隔
     * @return true/false
     */
    boolean lock(String key, long expire, int retryTimes, long sleepMillis);

    /**
     * 释放锁
     * @param key 需要释放锁的资源编号
     * @return true/false
     */
    boolean releaseLock(String key);

    /**
     * 释放锁
     * @param key 需要释放锁的资源编号
     * @return true/false
     */
    boolean unlock(String key);
}
